/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Club;
import com.rhf.core.dto.ClubVO;

/**
 * @author fabiensaulnier
 * 
 */
// TODO :: Finir la MàJ par rapport aux modifs de ClubVO
public class ClubImp extends Base implements Club {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Club#contructeur(java.sql.ResultSet)
	 */
	public ClubVO contructeur(ResultSet rs) throws Exception {

		ClubVO clubVO = new ClubVO();

		try {

			clubVO.setClubId(rs.getInt("club_id"));
			clubVO.setFfrsId(rs.getInt("ffrs_id"));
			clubVO.setDateCreation(rs.getTimestamp("date_creation"));
			clubVO.setDateModification(rs.getTimestamp("date_modification"));
			clubVO.setAuteurId(rs.getInt("auteur_id"));
			clubVO.setNom(rs.getString("nom"));
			clubVO.setNomUsuel(rs.getString("nom_usuel"));
			clubVO.setSitWeb(rs.getString("site_web"));
			clubVO.setUrlLogo(rs.getString("url_logo"));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return clubVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Club#ajouterClub(com.rhf.core.db.valuesobjects
	 * .ClubVO)
	 */
	public int ajouterClub(ClubVO clubVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "INSERT INTO club ";
		query += "(nom, nom_usuel) ";
		query += "VALUES (?, ?, ?)";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, clubVO.getClubId());
			stmt.setString(i++, clubVO.getNom());
			stmt.setString(i++, clubVO.getNomUsuel());

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Club#modifierClub(int)
	 */
	public int modifierClub(ClubVO clubVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "UPDATE INTO club ";
		query += "(nom, nom_usuel) ";
		query += "VALUES (?, ?) ";
		query += "WHERE club_id = ?";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setString(i++, clubVO.getNom());
			stmt.setString(i++, clubVO.getNomUsuel());
			stmt.setInt(i++, clubVO.getClubId());

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Club#recupererClub(int)
	 */
	public ClubVO recupererClub(int clubId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ClubVO clubVO = null;

		// Requête SQL
		String query = "SELECT * ";
		query += "FROM club";
		query += "WHERE club_id = ?";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, clubId);

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				clubVO = contructeur(rs);
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return clubVO;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Club#recupererListeClub()
	 */
	public List<ClubVO> recupererListeClub() throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<ClubVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM club ORDER BY nom_usuel";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<ClubVO>();
				list.add(contructeur(rs));
				while (rs.next()) {
					list.add(contructeur(rs));
				}
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Club#supprimerClub(int)
	 */
	public int supprimerClub(int clubId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "DELETE FROM club ";
		query += "WHERE club_id = ? ";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, clubId);

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
